package cn.walls1717.mall.modules.pms.service.impl;

import cn.walls1717.mall.modules.pms.dto.PageListDTO;
import cn.walls1717.mall.modules.pms.dto.ProductCateChildrenDTO;
import cn.walls1717.mall.modules.pms.dto.ProductCateDTO;
import cn.walls1717.mall.modules.pms.model.PmsProductCategory;
import cn.walls1717.mall.modules.pms.mapper.PmsProductCategoryMapper;
import cn.walls1717.mall.modules.pms.model.PmsProductCategoryAttributeRelation;
import cn.walls1717.mall.modules.pms.service.PmsProductCategoryAttributeRelationService;
import cn.walls1717.mall.modules.pms.service.PmsProductCategoryService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 产品分类 服务实现类
 * </p>
 *
 * @author walls1717
 * @since 2022-04-09
 */
@Service
public class PmsProductCategoryServiceImpl extends ServiceImpl<PmsProductCategoryMapper, PmsProductCategory> implements PmsProductCategoryService {

    private final PmsProductCategoryMapper categoryMapper;
    private final PmsProductCategoryAttributeRelationService cateAttrRelaService;
    @Autowired
    public PmsProductCategoryServiceImpl(PmsProductCategoryMapper categoryMapper, PmsProductCategoryAttributeRelationService cateAttrRelaService) {
        this.categoryMapper = categoryMapper;
        this.cateAttrRelaService = cateAttrRelaService;
    }

    @Override
    public Page<PmsProductCategory> pageList(PageListDTO pageListDTO) {
        LambdaQueryWrapper<PmsProductCategory> lqw = new LambdaQueryWrapper<>();
        lqw.eq(PmsProductCategory::getParentId, pageListDTO.getParentId())
                .orderByDesc(PmsProductCategory::getSort);
        Page<PmsProductCategory> page  = new Page<>(pageListDTO.getPageNum(), pageListDTO.getPageSize());
        categoryMapper.selectPage(page, lqw);
        return page;
    }

    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean createCategory(ProductCateDTO productCateDTO) {
        PmsProductCategory productCategory = getPmsProductCategory(productCateDTO);
        // 前端没有维护库存字段，在添加类别的时候要初始化库存
        productCategory.setProductCount(0);
        this.save(productCategory);
        saveCateAndAttrRela(productCateDTO, productCategory);
        return true;
    }

    @Override
    public boolean updateCategory(Long id, ProductCateDTO productCateDTO) {
        // 将数据传输对象转化为实体对象
        PmsProductCategory pmsProductCategory = getPmsProductCategory(productCateDTO);
        LambdaUpdateWrapper<PmsProductCategoryAttributeRelation> luw = new LambdaUpdateWrapper<>();
        luw.eq(PmsProductCategoryAttributeRelation::getProductCategoryId, id);
        // 先删除再保存
        cateAttrRelaService.remove(luw);
        saveCateAndAttrRela(productCateDTO, pmsProductCategory);
        this.updateById(pmsProductCategory);
        return true;
    }

    @Override
    public boolean deleteCategory(Integer id) {
        LambdaUpdateWrapper<PmsProductCategoryAttributeRelation> luw = new LambdaUpdateWrapper<>();
        luw.eq(PmsProductCategoryAttributeRelation::getProductCategoryId, id);
        this.removeById(id);
        cateAttrRelaService.remove(luw);
        return true;
    }

    @Override
    public boolean updateNavAndShowStatus(List<Long> ids, PmsProductCategory pmsProductCategory) {
        boolean result = false;
        // 根据 id 拿到所有的数据
        List<PmsProductCategory> pmsProductCategories = listByIds(ids);
        for (PmsProductCategory pc : pmsProductCategories) {
            // 判断根据 id 获取到的 导航栏状态 是否与前端传过来的状态相同
            if (pc.getNavStatus().equals(pmsProductCategory.getNavStatus())) {
                // 相同就不进行修改
                pc.setNavStatus(null);
            } else {
                // 不同进行修改
                pc.setNavStatus(pmsProductCategory.getNavStatus());
            }
            // 判断根据 id 获取到的 是否显示状态 是否与前端传过来的状态相同
            if (pc.getShowStatus().equals(pmsProductCategory.getShowStatus())) {
                pc.setShowStatus(null);
            } else {
                pc.setShowStatus(pmsProductCategory.getShowStatus());
            }
            // 根据 id 进行修改
            result = updateById(pc);
        }
        return result;
    }

    @Override
    public List<ProductCateChildrenDTO> withChildren() {
        return categoryMapper.withChildren();
    }

    /**
     * 将数据传输对象转化为实体类对象
     * @param productCateDTO 数据传输对象
     * @return 实体类对象
     */
    private PmsProductCategory getPmsProductCategory(ProductCateDTO productCateDTO) {
        PmsProductCategory productCategory = new PmsProductCategory();
        // DTO不是对应的数据库表，因此还是需要将数据拷贝到对应的实体类进行操作
        BeanUtils.copyProperties(productCateDTO, productCategory);
        if (productCategory.getParentId() == 0) {
            // 没有指定 parentId 那么就是一级分类
            productCategory.setLevel(0);
        } else {
            productCategory.setLevel(1);
        }
        return productCategory;
    }

    /**
     * 保存类别与属性参数之间的关系
     * @param productCateDTO 属性参数
     * @param productCategory 。
     */
    private void saveCateAndAttrRela(ProductCateDTO productCateDTO, PmsProductCategory productCategory) {
        List<Long> attrIdList = productCateDTO.getProductAttributeIdList();
        List<PmsProductCategoryAttributeRelation> list = new ArrayList<>();
        for (Long attrId : attrIdList) {
            PmsProductCategoryAttributeRelation cateAttrRela = new PmsProductCategoryAttributeRelation();
            cateAttrRela.setProductCategoryId(productCategory.getId());
            cateAttrRela.setProductAttributeId(attrId);
            list.add(cateAttrRela);
        }
        cateAttrRelaService.saveBatch(list);
    }


}
